1 Domain problem formulation

What is the real-world question? This could be hypothesis-driven or discovery-based.

This should be very high level, providing the big picture behind the study. Often this takes the form of a pre-existing hypothesis (e.g., individuals with a specific genetic mutation are more likely to have a given characteristic) or more open-ended discovery (e.g., identify mutations that are related to a given characteristic).


Why is this question interesting and important? What are the implications of better understanding this data?

Try to incentive this study for those coming from a variety of backgrounds and levels of scientific understanding. Perhaps mention how previous related work made an impact in the field.


Briefly describe any background information necessary to understand this problem.

This should provide readers some intuition for the scientific problem. This section should be a short high-level summary. For additional details, one can refer readers to introductory material, tutorials, and/or review papers.


Briefly describe how this question can be answered in the context of a model or analysis.


Outline the rest of the report/analysis.


2 Data

What is the data under investigation? Provide a brief overview/description of the data.


Describe how your data connects to the domain problem.


2.1 Data Collection

How was the data collected or generated (including details on the experimental design)? Be as transparent as possible so that conclusions made from this data are not misinterpreted down the road.


Describe any limitations when using the data to answer the domain problem of interest.

While the previous section lays out the entire collection process, here it is important to highlight any limitations as these may not be obvious to those from other fields. This includes any personal judgement calls made in the data collection process.


Where is the data stored, and how can it be accessed by others (if applicable)?


2.2 Data Splitting

Decide on the proportion of data in each split.

Decide on the “how” to split the data (e.g., random sampling, stratified sampling, etc.), and explain why this is a reasonable way to split the data.

Here, we refer to splitting data into training, validation, and test portions. Generally, one fits select models (including any necessary tuning procedures) on the training data and assesses prediction accuracy on the validation data to compare models against one another. The test data should only be utilized once after all data analysis is completed.

Note that how the data splitting is performed can greatly affect the results. This is because data often have underlying inherent structures and relationships (e.g., longitudinal information, related individuals, ethnicity, varying hospitals, etc.) that should be preserved when splitting. As a concrete example, if the data under study comes from patients across four hospitals, it is often advisable to perform the data splitting by hospital so that the training set is composed of all patients from hospitals A and B, the validation set is composed of all patients from hospital C, and the test set is composed of all patients from hospital D. By splitting the data in this way, the validation (or test) accuracy is a more accurate evaluation of how the fitted model will perform on a completely new batch of data in the future. Ultimately, the goal of the data splitting scheme is to mimic the process of obtaining new future data.


Split the data into a training, validation, and test set.

data_split <- split_data(X = X, y = y, stratified_by = y,
                         train_prop = params$train_prop, 
                         valid_prop = params$valid_prop, 
                         test_prop = params$test_prop)
Xtrain <- data_split$X$train
Xvalid <- data_split$X$validate
Xtest <- data_split$X$test
ytrain <- data_split$y$train
yvalid <- data_split$y$validate
ytest <- data_split$y$test

Provide summary statistics and/or figures of the three data sets to illustrate how similar (or different) they are.

This step is important as it can highlight any concerns with your chosen splitting rule. For instance, under the classification setting, the distribution of categories should be similar across the three data sets.


2.2.1 Data Splitting Overview

X Data Split

plot_data_split(Xtrain, Xvalid, Xtest, 
                xlab = "X", title = "Overall X Distribution")

Y Data Split

plot_data_split(ytrain, yvalid, ytest, 
                xlab = "y", title = "Overall y Distribution")

2.3 Data Cleaning and Preprocessing

What steps were taken to clean the data? More importantly, why was the data cleaned in this way?

Data cleaning can be very problem and domain dependent. Be sure to specify which approaches are common in the field and why. Where appropriate, highlight any steps that were judgement calls necessary to continue the analysis.

Discuss all inconsistencies, problems, oddities in the data (e.g., missing data, errors in data, outliers, etc.).

Record your preprocessing steps in a way such that if someone else were to reproduce your analysis, they could easily replicate and understand your steps.

It can be helpful to include relevant plots that explain/justify the choices that were made when cleaning the data.

If more than one preprocessing pipeline is reasonable, examine the impacts of these alternative preprocessing pipelines on the final data results.

There are often multiple, standard preprocessing options that should be tested to assess stability of results. Any judgement calls mentioned above should also be compared with alternative choices where possible.

Again, be as transparent as possible. This allows others to make their own educated decisions on how best to preprocess the data.


## DO DATA CLEANING / PRE-PROCESSING HERE 
Xtrain <- log(Xtrain + 1) %>%
  remove_constant_cols(verbose = 1) %>%
  remove_duplicate_cols(verbose = 1) %>%
  filter_cols_by_var(max_p = 1000)
#> Removed 296 features with constant values
#> Removed 5 features that are duplicated
Xvalid <- log(Xvalid + 1)[, colnames(Xtrain)]
Xtest <- log(Xtest + 1)[, colnames(Xtrain)]

2.4 Data Exploration

The main goal of this section is to give the reader a feel for what the data “looks like” at a basic level.

Provide plots that summarize the data and perhaps even plots that convey some smaller findings which ultimately motivate the main findings.

Provide additional plots representing remaining oddities after pre-processing if applicable.

Add summary statistics in accompanying tables (or in figures) for quick comparisons.


2.4.1 Data Overview

#> Number of features: 1000
#> Number of training samples: 649
#> Number of validaiton samples: 216
#> Number of test samples: 218
# summary of types of features in (X, y) data
get_data_types(X = Xtrain, y = ytrain)

Summary Tables

# broad array of summary statistics for features in training (X, y)
tab_ls <- get_data_summary(X = Xtrain, y = ytrain)
for (dtype in names(tab_ls)) {  # grouped by data type
  subchunkify(tab_ls[[dtype]], i = dtype, other_args = "results='asis'")
}

X Distribution

# plot X distribution
plot_data_distribution(data = Xtrain, 
                       xlab = "X", title = "Training X Distribution")

Y Distribution

# plot y distribution
plot_data_distribution(data = ytrain, 
                       xlab = "y", title = "Training y Distribution")

Data Heatmap

# (clustered) heatmap of (X, y) data
plot_data_heatmap(X = Xtrain, y = ytrain, clust_rows = TRUE, clust_cols = TRUE,
                  show_ytext = FALSE, x_text_angle = TRUE)

Feature Correlation

# (clustered) correlation heatmap
plot_cor_heatmap(X = Xtrain, cor_type = "pearson", clust = TRUE,
                 x_text_angle = TRUE) +
  ggplot2::labs(x = "Features", y = "Features", fill = "Cor.")

Feature Pair Plots

# feature pair plot (for a subset of features)
keep_features <- sort(
  sample(1:ncol(Xtrain), min(ncol(Xtrain), 6), replace = FALSE)
)
plot_pairs(data = Xtrain, columns = keep_features, 
           color = ytrain, color_label = "y")

Marginal Associations

# marginal association plots (for a subset of features)
caret::featurePlot(x = Xtrain[, keep_features],
                   y = ytrain,
                   plot = if (is.factor(ytrain)) "box" else "scatter",
                   scales = list(x = list(relation = "free"), 
                                 y = list(relation = "free")))

PCA

# pca plot
plot_pca(X = Xtrain, npcs = 3, color = ytrain, color_label = "y",
         center = TRUE, scale = FALSE)$plot

3 Prediction Modeling

Discuss the prediction methods under consideration, and explain why these methods were chosen.

There are an overwhelming number of methods available, but at least one should be a common approach acting as a baseline. This may not be optimal for the problem setting, but serves as a helpful comparison. Any “go-to” methods in this scientific domain should also be considered. Discuss why these are favored. For instance, is there a natural structure in the data that is better utilized in one approach vs another? Conversely, mention if there are approaches that are typically avoided in these problems. The limitations discussed previously can also help to guide these modeling decisions.

Furthermore, think back to the big picture. If interpretability is important, methods favoring sparser, simpler models may be preferred (e.g., sparse regression or tree-based procedures). If prediction is the sole goal, more complex models may be appropriate.

If computing time is a burden and rules out methods with high potential, this should be highlighted for future reference as scalability and/or computing resources improve.


Discuss the accuracy metrics under consideration, and explain why these metrics were chosen.

These accuracy metrics should clearly support the main goal of the study. There are often multiple ways to quantify accuracy (e.g., RMSE, \(R^2\), correlation, AUROC, AUPRC, classification accuracy). Often, comparing across several metrics provides an additional stability check and a more holistic picture of the model performance.


3.1 Prediction check

Carry out the prediction pipeline, outlined above.

  1. Fit prediction methods on training data. (Note: this includes any parameter tuning which may require further data splitting (e.g., k-fold cross-validation) within the training data.)
  2. Evaluate prediction methods on validation data.
  3. Compare results, and filter out poor models.


## IF USING TIDYMODELS BACKEND, CHOOSE METHODS AND TRAINING CONTROLS HERE
cv_options <- list(nfolds = 5,
                   foldids = NULL,
                   metric = "accuracy")

model_list <- list(
  rand_forest = list(.tune_params = list(mtry = round(seq(sqrt(ncol(Xtrain)),
                                                          ncol(Xtrain) / 3,
                                                          length.out = 3))),
                     engine = list(engine = "ranger",
                                   importance = "impurity")),
  boost_tree = list(engine = "xgboost")
)
# fit/train models
fit_results <- fit_models(Xtrain = Xtrain, ytrain = ytrain,
                          model_list = model_list, cv_options = cv_options,
                          use = params$modeling_pkg)
#> [16:47:41] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

# make prediction on validation set
pred_results <- predict_models(fit_list = fit_results, Xtest = Xvalid)

# evaluate predictions on validation set
eval_results <- evaluate_models(pred_df = pred_results, ytest = yvalid)

# collect feature importance metrics from model fits
imp_results <- interpret_models(fit_list = fit_results)

Fit Summary

rand_forest

#> Fitting time taken: 2.65675708055496 min
#> 
#> =====================================================
#> ================ Tuned Model Summary ================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: rand_forest()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> Ranger result
#> 
#> Call:
#>  ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~182,      x), importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 
#> 
#> Type:                             Probability estimation 
#> Number of trees:                  500 
#> Sample size:                      649 
#> Number of independent variables:  1000 
#> Mtry:                             182 
#> Target node size:                 10 
#> Variable importance mode:         impurity 
#> Splitrule:                        gini 
#> OOB prediction error (Brier s.):  0.1597182 
#> 
#> 
#> ======================================================
#> ==== Summary of CV Fit for Tuning Hyperparameters ====
#> ======================================================
#> 
#> # Tuning results
#> # 5-fold cross-validation 
#> # A tibble: 5 × 4
#>   splits            id    .metrics         .notes          
#>   <list>            <chr> <list>           <list>          
#> 1 <split [519/130]> Fold1 <tibble [6 × 5]> <tibble [0 × 1]>
#> 2 <split [519/130]> Fold2 <tibble [6 × 5]> <tibble [0 × 1]>
#> 3 <split [519/130]> Fold3 <tibble [6 × 5]> <tibble [0 × 1]>
#> 4 <split [519/130]> Fold4 <tibble [6 × 5]> <tibble [0 × 1]>
#> 5 <split [520/129]> Fold5 <tibble [6 × 5]> <tibble [0 × 1]>
#> 
#> # Metrics Summary
#> # A tibble: 6 × 9
#>    mtry .metric   Mean      SD Fold1 Fold2 Fold3 Fold4 Fold5
#>   <dbl> <chr>    <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    32 accuracy 0.815 0.0343  0.823 0.808 0.854 0.762 0.829
#> 2   182 accuracy 0.823 0.0455  0.769 0.823 0.892 0.8   0.829
#> 3   333 accuracy 0.823 0.0380  0.792 0.815 0.885 0.792 0.829
#> 4    32 roc_auc  0.959 0.00477 0.957 0.966 0.959 0.960 0.953
#> 5   182 roc_auc  0.962 0.00688 0.956 0.969 0.964 0.967 0.953
#> 6   333 roc_auc  0.958 0.00851 0.945 0.967 0.961 0.962 0.954

boost_tree

#> Fitting time taken: 0.111444433530172 min
#> 
#> =====================================================
#> =================== Model Summary ===================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: boost_tree()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ##### xgb.Booster
#> raw: 137.4 Kb 
#> call:
#>   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
#>     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
#>     subsample = 1, objective = "multi:softprob"), data = x$data, 
#>     nrounds = 15, watchlist = x$watchlist, verbose = 0, num_class = 5L, 
#>     nthread = 1)
#> params (as set within xgb.train):
#>   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", objective = "multi:softprob", num_class = "5", nthread = "1", validate_parameters = "TRUE"
#> xgb.attributes:
#>   niter
#> callbacks:
#>   cb.evaluation.log()
#> # of features: 1000 
#> niter: 15
#> nfeatures : 1000 
#> evaluation_log:
#>     iter training_mlogloss
#>        1          1.046141
#>        2          0.749682
#> ---                       
#>       14          0.045483
#>       15          0.038782

Prediction Results

Confusion Tables

boost_tree Confusion Matrix on Validation Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 37 0 0 0 3
Her2 1 14 2 0 3
LumA 0 1 108 14 0
LumB 0 1 1 28 0
Normal 0 0 1 0 2
rand_forest Confusion Matrix on Validation Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 38 0 0 0 3
Her2 0 13 1 0 1
LumA 0 1 109 16 2
LumB 0 2 2 26 0
Normal 0 0 0 0 2

ROC Plot

PR Plot

3.2 Stability check

Taking the prediction methods that pass the prediction check, perform a stability analysis.

One way to assess a model’s stability is to assess changes in model’s validation accuracy based on appropriate data perturbations of the training data. However, this stability analysis is heavily dependent on the problem at hand and should be tailored to assess the stability of metrics that are relevant to the domain problem.

  1. Specify and justify the appropriate data perturbation(s).

    As when determining an appropriate splitting rule, the perturbation scheme should incorporate any known data structure. For instance, if using a bootstrap approach with structured data, stratified sampling may be more appropriate to better mimic the process of obtaining a new batch of data in the future.

  2. Re-fit the prediction methods on these perturbed data sets.
  3. Evaluate prediction methods on validation data.
  4. Assess stability across the data perturbations as well as across the various methods.
  5. Filter out poor models where necessary and interpret stability results.

    Methods with highly variable accuracy should be discarded. In addition, take note if any set of perturbations resulted in uniformly poor accuracy across methods. This could indicate an underlying issue with the perturbation scheme.


n_reps <- params$n_data_perturbations

# p <- progressr::progressor(steps = n_reps)
# future::plan(multisession, workers = min(n_reps, parallel::detectCores() - 1))
bootstrap_model_results <- future.apply::future_replicate(
  n = n_reps,
  expr = {
    bootstrap <- sample(1:nrow(Xtrain), nrow(Xtrain), replace = TRUE)
    Xtrain_b <- Xtrain[bootstrap, ]
    ytrain_b <- ytrain[bootstrap]
    
    # fit/train models on bootstrap data
    fit_results_b <- fit_models(Xtrain = Xtrain_b, ytrain = ytrain_b,
                                model_list = model_list, cv_options = cv_options,
                                use = params$modeling_pkg)

    # make prediction on validation set
    pred_results_b <- predict_models(fit_list = fit_results_b, Xtest = Xvalid)

    # evaluate predictions on validation set
    eval_results_b <- evaluate_models(pred_df = pred_results_b, ytest = yvalid)
    
    # collect feature importance metrics from model fits
    imp_results_b <- interpret_models(fit_list = fit_results_b)
    
    return(list(# fit = fit_results_b,  # uncomment if need bootstrap fits; can be memory intensive
                predictions = pred_results_b,
                eval_metrics = eval_results_b,
                importances = imp_results_b))
  },
  simplify = FALSE
)
#> [16:49:57] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.
#> [16:51:59] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

bootstrap_model_errs <- purrr::map_dfr(bootstrap_model_results,
                                       ~.x$eval_metrics$metrics,
                                       .id = "bootstrap_id")
bootstrap_model_preds <- purrr::map(bootstrap_model_results, "predictions")
bootstrap_model_imps <- purrr::map_dfr(bootstrap_model_results, "importances",
                                       .id = "bootstrap_id")

# summarize bootstrap model error metrics
bootstrap_model_errs_summary <- bootstrap_model_errs %>%
  tidyr::pivot_longer(cols = c(-bootstrap_id, -metric), 
                      names_to = "Method", values_to = "Value") %>%
  dplyr::rename(Metric = metric) %>%
  dplyr::group_by(Method, Metric) %>%
  dplyr::summarise(Mean = mean(Value), SD = sd(Value), .groups = "drop") %>%
  tidyr::pivot_longer(cols = c(Mean, SD), 
                      values_to = "Value", names_to = "Statistic") %>%
  tidyr::pivot_wider(names_from = "Method", values_from = "Value") %>%
  dplyr::arrange(Metric, Statistic)

Table

# table of accuracy metrics
pretty_table(
  bootstrap_model_errs_summary, 
  digits = 2, sigfig = FALSE, rownames = FALSE,
  caption = "Validation Prediction Accuracies Over Bootstrapped Training Fits", 
  html_options = list(
    extensions = "RowGroup",
    options = list(
      dom = "t",
      pageLength = nrow(bootstrap_model_errs_summary),
      scrollY = "500px",
      rowGroup = list(dataSrc = 0),
      columnDefs = list(list(className = "dt-center", targets = "_all"),
                        list(visible = FALSE, targets = 0),
                        list(title = "Metric", targets = 1))
    )
  )
)

Plot

# boxplots
bootstrap_model_errs %>%
  tidyr::pivot_longer(cols = c(-bootstrap_id, -metric), 
                      names_to = "Method", values_to = "Value") %>%
  plot_boxplot(x_str = "Method", y_str = "Value") +
  ggplot2::facet_wrap(~ metric) +
  ggplot2::labs(title = "Validation Prediction Accuracies Over Bootstrapped Training Fits")

3.3 Interpretability

For the models that pass the prediction and stability checks, extract the important features in the predictive models that are stable across both data and model perturbations. Determining the importance of a feature can be method dependent.


Full Model (without stability)

Table

pretty_table(imp_results, digits = 2, sigfig = FALSE,
             caption = "Variable Importances")

Plots

plot_feature_importance(imp_results,
                        use_rankings = FALSE,
                        use_facets = TRUE,
                        interactive = FALSE)

plot_feature_importance_pair(imp_results,
                             use_rankings = TRUE,
                             interactive = FALSE)

Bootstrapped Model (with stability)

Table

bootstrap_model_imps_summary <- bootstrap_model_imps %>%
  dplyr::group_by(Method, Variable) %>%
  dplyr::summarise(`Mean Importance` = mean(Importance),
                   `Median Importance` = median(Importance),
                   `SD Importance` = sd(Importance),
                   `Min Importance` = min(Importance),
                   `Max Importance` = max(Importance), 
                   .groups = "keep")
pretty_table(
  bootstrap_model_imps_summary, 
  digits = 2, sigfig = F, 
  caption = "Summary of variable importances across bootstrapped models"
)

Plots

plot_feature_importance_stability(bootstrap_model_imps,
                                  use_rankings = FALSE,
                                  use_facets = TRUE,
                                  interactive = FALSE)

4 Main Results

Interpret and summarize the prediction and stability results.


Evaluate pipeline on test data.

Careful! Remember that test data should only be touched once. These results should not be used to make post-analysis modeling decisions. This is “double-dipping” and not an accurate measurement of out-of-sample accuracy.

Xtrain_final <- dplyr::bind_rows(Xtrain, Xvalid)
ytrain_final <- c(ytrain, yvalid)

# fit/train models
fit_results_final <- fit_models(Xtrain = Xtrain_final, ytrain = ytrain_final,
                                model_list = model_list, cv_options = cv_options,
                                use = params$modeling_pkg)
#> [16:56:31] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

# make prediction on test set
pred_results_final <- predict_models(fit_list = fit_results_final, Xtest = Xtest)

# evaluate predictions on test set
eval_results_final <- evaluate_models(pred_df = pred_results_final, ytest = ytest)

# collect feature importance metrics from model fits
imp_results_final <- interpret_models(fit_list = fit_results_final)

Summarize test set prediction and/or interpretability results.


Fit Summary

rand_forest

#> Fitting time taken: 4.32773008346558 min
#> 
#> =====================================================
#> ================ Tuned Model Summary ================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: rand_forest()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> Ranger result
#> 
#> Call:
#>  ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~333,      x), importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 
#> 
#> Type:                             Probability estimation 
#> Number of trees:                  500 
#> Sample size:                      865 
#> Number of independent variables:  1000 
#> Mtry:                             333 
#> Target node size:                 10 
#> Variable importance mode:         impurity 
#> Splitrule:                        gini 
#> OOB prediction error (Brier s.):  0.1390541 
#> 
#> 
#> ======================================================
#> ==== Summary of CV Fit for Tuning Hyperparameters ====
#> ======================================================
#> 
#> # Tuning results
#> # 5-fold cross-validation 
#> # A tibble: 5 × 4
#>   splits            id    .metrics         .notes          
#>   <list>            <chr> <list>           <list>          
#> 1 <split [692/173]> Fold1 <tibble [6 × 5]> <tibble [0 × 1]>
#> 2 <split [692/173]> Fold2 <tibble [6 × 5]> <tibble [0 × 1]>
#> 3 <split [692/173]> Fold3 <tibble [6 × 5]> <tibble [0 × 1]>
#> 4 <split [692/173]> Fold4 <tibble [6 × 5]> <tibble [0 × 1]>
#> 5 <split [692/173]> Fold5 <tibble [6 × 5]> <tibble [0 × 1]>
#> 
#> # Metrics Summary
#> # A tibble: 6 × 9
#>    mtry .metric   Mean     SD Fold1 Fold2 Fold3 Fold4 Fold5
#>   <dbl> <chr>    <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    32 accuracy 0.827 0.0142 0.832 0.815 0.809 0.844 0.832
#> 2   182 accuracy 0.846 0.0113 0.850 0.838 0.850 0.861 0.832
#> 3   333 accuracy 0.847 0.0176 0.850 0.832 0.867 0.861 0.827
#> 4    32 roc_auc  0.967 0.0126 0.969 0.978 0.979 0.953 0.954
#> 5   182 roc_auc  0.969 0.0151 0.975 0.982 0.981 0.951 0.953
#> 6   333 roc_auc  0.967 0.0169 0.973 0.981 0.982 0.946 0.951

boost_tree

#> Fitting time taken: 0.146598549683889 min
#> 
#> =====================================================
#> =================== Model Summary ===================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: boost_tree()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ##### xgb.Booster
#> raw: 155.1 Kb 
#> call:
#>   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
#>     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
#>     subsample = 1, objective = "multi:softprob"), data = x$data, 
#>     nrounds = 15, watchlist = x$watchlist, verbose = 0, num_class = 5L, 
#>     nthread = 1)
#> params (as set within xgb.train):
#>   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", objective = "multi:softprob", num_class = "5", nthread = "1", validate_parameters = "TRUE"
#> xgb.attributes:
#>   niter
#> callbacks:
#>   cb.evaluation.log()
#> # of features: 1000 
#> niter: 15
#> nfeatures : 1000 
#> evaluation_log:
#>     iter training_mlogloss
#>        1          1.050810
#>        2          0.747666
#> ---                       
#>       14          0.045500
#>       15          0.038370

Prediction Results

Confusion Tables

boost_tree Confusion Matrix on Test Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 37 1 0 1 2
Her2 1 13 0 1 1
LumA 0 1 110 17 4
LumB 0 2 3 23 0
Normal 0 0 0 0 1
rand_forest Confusion Matrix on Test Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 37 1 0 0 2
Her2 1 13 0 0 1
LumA 0 1 110 15 4
LumB 0 2 3 27 0
Normal 0 0 0 0 1

ROC Plot

PR Plot

5 Post hoc analysis

Move beyond the global prediction accuracy metrics and dive deeper into individual-level predictions for the validation and/or test set, i.e., provide a more “local” analysis.

Examine any points that had poor predictions.

As mentioned in the stability analysis, check for any commonalities among perturbations, or specific observations, that resulted in poor accuracy metrics across procedures.

Examine differences between prediction methods.

Are there certain methods that may not be overall the most accurate, but outperform others on the more “challenging” validation/test observations? Conversely, are some procedures very effective across the majority of observations, but some outlying behavior effects overall results?


pred_results_final %>%
  dplyr::mutate(.id = rep(1:nrow(Xtest), length.out = dplyr::n())) %>%
  tidyr::pivot_wider(id_cols = .id, 
                     names_from = "method", values_from = "predictions") %>%
  dplyr::mutate(`True Responses` = ytest) %>%
  plot_pairs(columns = 2:(length(unique(pred_results_final$method)) + 2),
             title = "Comparison of model test predictions")

6 Conclusions

Reiterate main findings, note any caveats, and clearly translate findings/analysis back to the domain problem context.


LS0tCnRpdGxlOiAiUENTIERvY3VtZW50YXRpb24iCmF1dGhvcjogIiIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpoZWFkZXItaW5jbHVkZXM6CiAgICAtIFx1c2VwYWNrYWdle2Zsb2F0fQogICAgLSBcdXNlcGFja2FnZXthbXNtYXRofQogICAgLSBcdXNlcGFja2FnZXtnZW5zeW1ifQogICAgLSBcdXNlcGFja2FnZXt0Y29sb3Jib3h9Cm91dHB1dDoKICB2ZG9jczo6dmVyaWRpY2FsOgogICAgbGFiX25vdGVib29rOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBwZGZfZG9jdW1lbnQ6CiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKcGFyYW1zOgogICMjIElOUFVUIFBBUkFNRVRFUlMgSEVSRSBPUiBVU0lORyAiS25pdCB3aXRoIFBhcmFtZXRlcnMuLi4iIElOIEFCT1ZFIEtOSVQgTUVOVQogIFhfZmlsZXBhdGg6CiAgICBsYWJlbDogIlggRGF0YSIKICAgICMgc3BlY2lmeSBmaWxlIHBhdGggZm9yIFggZGF0YQogICAgdmFsdWU6IGRhdGEvdGNnYV9icmNhX2FycmF5X2RhdGEucmRzICAKICAgIGlucHV0OiBmaWxlIAogIHlfZmlsZXBhdGg6CiAgICBsYWJlbDogInkgZGF0YSIKICAgICMgc3BlY2lmeSBmaWxlIHBhdGggZm9yIHkgZGF0YQogICAgdmFsdWU6IGRhdGEvdGNnYV9icmNhX3N1YnR5cGVzLnJkcyAgCiAgICBpbnB1dDogZmlsZQogIHRyYWluX3Byb3A6CiAgICBsYWJlbDogIlRyYWluaW5nIGRhdGEgcHJvcG9ydGlvbiIKICAgICMgc3BlY2lmeSBwcm9wb3J0aW9uIG9mIGRhdGEgdG8gcHV0IGluIHRyYWluaW5nIHNldAogICAgdmFsdWU6IDAuNiAgCiAgICBpbnB1dDogbnVtZXJpYwogIHZhbGlkX3Byb3A6CiAgICBsYWJlbDogIlZhbGlkYXRpb24gZGF0YSBwcm9wb3J0aW9uIgogICAgIyBzcGVjaWZ5IHByb3BvcnRpb24gb2YgZGF0YSB0byBwdXQgaW4gdmFsaWRhdGlvbiBzZXQKICAgIHZhbHVlOiAwLjIgIAogICAgaW5wdXQ6IG51bWVyaWMKICB0ZXN0X3Byb3A6CiAgICBsYWJlbDogIlRlc3QgZGF0YSBwcm9wb3J0aW9uIgogICAgIyBzcGVjaWZ5IHByb3BvcnRpb24gb2YgZGF0YSB0byBwdXQgaW4gdGVzdCBzZXQKICAgIHZhbHVlOiAwLjIgIAogICAgaW5wdXQ6IG51bWVyaWMKICBtb2RlbGluZ19wa2c6CiAgICBsYWJlbDogIk1vZGVsaW5nIFBhY2thZ2UiCiAgICAjIHNwZWNpZnkgd2hpY2ggbW9kZWxpbmcgcGFja2FnZSB0byB1c2UKICAgIHZhbHVlOiAidGlkeW1vZGVscyIgIAogICAgaW5wdXQ6IHNlbGVjdAogICAgY2hvaWNlczogWyJjYXJldCIsICJoMm8iLCAidGlkeW1vZGVscyJdCiAgbl9kYXRhX3BlcnR1cmJhdGlvbnM6CiAgICBsYWJlbDogIk51bWJlciBvZiBkYXRhIHBlcnR1cmJhdGlvbnMgKGUuZy4sIGJvb3RzdHJhcCBzYW1wbGVzKSIKICAgICMgc3BlY2lmeSBudW1iZXIgb2YgZGF0YSBwZXJ0dXJiYXRpb25zOyBub3RlOiBpbmNyZWFzZSBmb3IgYmV0dGVyIG1lYXN1cmUgCiAgICAjIG9mIHN0YWJpbGl0eSwgYnV0IGF0IHRoZSBjb3N0IG9mIGhpZ2hlciBjb21wdXRhdGlvbmFsIGxvYWQKICAgIHZhbHVlOiAyICAKICAgIGlucHV0OiBudW1lcmljCiAgc2VlZDoKICAgIGxhYmVsOiAiUmFuZG9tIFNlZWQiCiAgICAjIHNwZWNpZnkgcmFuZG9tIHNlZWQKICAgIHZhbHVlOiAxMjM0NQogICAgaW5wdXQ6IG51bWVyaWMKLS0tCgo8IS0tIElOU1RSVUNUSU9OUzogVGhpcyBSbWFya2Rvd24gZmFjaWxpdGF0ZXMgYmVhdXRpZnVsIGRvY3VtZW50YXRpb24gZm9yIFBDUy1zdHlsZSBhbmFseXNlcy4gQWZ0ZXIgaW5wdXR0aW5nIGluIHRoZSByZXF1aXJlZCBkYXRhIGFuZCBwYXJhbWV0ZXJzIGFib3ZlLCBwbGVhc2UgZ28gdGhyb3VnaCBhbmQgcHJvdmlkZSByZXNwb25zZXMgdG8gYWxsIHF1ZXN0aW9ucyBpbiB0aGUgbm90ZWJvb2sgYmVsb3cuIFJlc3BvbnNlcyBzaG91bGQgYmUgdHlwZWQgaW4gYWxsIGNodW5rcyB3aXRoIHRoZSBoZWFkZXIgYGludGVyYWN0aXZlX3RleHQgPSBUUlVFYC4gLS0+CgpgYGB7ciBzZXR1cCwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICJoaWRlIn0KbGlicmFyeSh2ZG9jcykKCiMgc2V0IHVwIGtuaXRyIG9wdGlvbnMgZm9yIHZkb2NzCnZkb2NzX2tuaXRyX3NldHVwKCkKCiMgc2V0IHNlZWQKc2V0LnNlZWQocGFyYW1zJHNlZWQpCgojIHZhbGlkYXRlIGlucHV0cwp2YWxpZGF0ZV9kYXRhX3NwbGl0KHBhcmFtcyR0cmFpbl9wcm9wLCBwYXJhbXMkdmFsaWRfcHJvcCwgcGFyYW1zJHRlc3RfcHJvcCkKCiMgbG9hZCBkYXRhIGluClggPC0gbG9hZF9maWxlKHBhcmFtcyRYX2ZpbGVwYXRoKQp5IDwtIGxvYWRfZmlsZShwYXJhbXMkeV9maWxlcGF0aCkKdmFsaWRhdGVfZGF0YShYLCB5KQpgYGAKCmBgYHtyIGxvYWQtc2F2ZWQtcmVzcG9uc2VzLCBldmFsID0ga25pdHI6OmlzX2h0bWxfb3V0cHV0KCksIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIiwgY2FjaGUgPSBGQUxTRX0KbG9hZF9zYXZlZF9yZXNwb25zZXMoKQpgYGAKCiMgRG9tYWluIHByb2JsZW0gZm9ybXVsYXRpb24KCldoYXQgaXMgdGhlIHJlYWwtd29ybGQgcXVlc3Rpb24/IFRoaXMgY291bGQgYmUgaHlwb3RoZXNpcy1kcml2ZW4gb3IgZGlzY292ZXJ5LWJhc2VkLgoKYGBge2FzaXMsIGhlbHAgPSBUUlVFfQpUaGlzIHNob3VsZCBiZSB2ZXJ5IGhpZ2ggbGV2ZWwsIHByb3ZpZGluZyB0aGUgYmlnIHBpY3R1cmUgYmVoaW5kIHRoZSBzdHVkeS4gT2Z0ZW4gdGhpcyB0YWtlcyB0aGUgZm9ybSBvZiBhIHByZS1leGlzdGluZyBoeXBvdGhlc2lzIChlLmcuLCBpbmRpdmlkdWFscyB3aXRoIGEgc3BlY2lmaWMgZ2VuZXRpYyBtdXRhdGlvbiBhcmUgbW9yZSBsaWtlbHkgdG8gaGF2ZSBhIGdpdmVuIGNoYXJhY3RlcmlzdGljKSBvciBtb3JlIG9wZW4tZW5kZWQgZGlzY292ZXJ5IChlLmcuLCBpZGVudGlmeSBtdXRhdGlvbnMgdGhhdCBhcmUgcmVsYXRlZCB0byBhIGdpdmVuIGNoYXJhY3RlcmlzdGljKS4KYGBgCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCldoeSBpcyB0aGlzIHF1ZXN0aW9uIGludGVyZXN0aW5nIGFuZCBpbXBvcnRhbnQ/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgYmV0dGVyIHVuZGVyc3RhbmRpbmcgdGhpcyBkYXRhPwoKYGBge2FzaXMsIGhlbHAgPSBUUlVFfQpUcnkgdG8gaW5jZW50aXZlIHRoaXMgc3R1ZHkgZm9yIHRob3NlIGNvbWluZyBmcm9tIGEgdmFyaWV0eSBvZiBiYWNrZ3JvdW5kcyBhbmQgbGV2ZWxzIG9mIHNjaWVudGlmaWMgdW5kZXJzdGFuZGluZy4gUGVyaGFwcyBtZW50aW9uIGhvdyBwcmV2aW91cyByZWxhdGVkIHdvcmsgbWFkZSBhbiBpbXBhY3QgaW4gdGhlIGZpZWxkLgpgYGAKCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKQnJpZWZseSBkZXNjcmliZSBhbnkgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gdW5kZXJzdGFuZCB0aGlzIHByb2JsZW0uCgpgYGB7YXNpcywgaGVscCA9IFRSVUV9ClRoaXMgc2hvdWxkIHByb3ZpZGUgcmVhZGVycyBzb21lIGludHVpdGlvbiBmb3IgdGhlIHNjaWVudGlmaWMgcHJvYmxlbS4gVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBhIHNob3J0IGhpZ2gtbGV2ZWwgc3VtbWFyeS4gRm9yIGFkZGl0aW9uYWwgZGV0YWlscywgb25lIGNhbiByZWZlciByZWFkZXJzIHRvIGludHJvZHVjdG9yeSBtYXRlcmlhbCwgdHV0b3JpYWxzLCBhbmQvb3IgcmV2aWV3IHBhcGVycy4KYGBgCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCkJyaWVmbHkgZGVzY3JpYmUgaG93IHRoaXMgcXVlc3Rpb24gY2FuIGJlIGFuc3dlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgbW9kZWwgb3IgYW5hbHlzaXMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCk91dGxpbmUgdGhlIHJlc3Qgb2YgdGhlIHJlcG9ydC9hbmFseXNpcy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyBEYXRhCgpXaGF0IGlzIHRoZSBkYXRhIHVuZGVyIGludmVzdGlnYXRpb24/IFByb3ZpZGUgYSBicmllZiBvdmVydmlldy9kZXNjcmlwdGlvbiBvZiB0aGUgZGF0YS4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKRGVzY3JpYmUgaG93IHlvdXIgZGF0YSBjb25uZWN0cyB0byB0aGUgZG9tYWluIHByb2JsZW0uCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIERhdGEgQ29sbGVjdGlvbgoKSG93IHdhcyB0aGUgZGF0YSBjb2xsZWN0ZWQgb3IgZ2VuZXJhdGVkIChpbmNsdWRpbmcgZGV0YWlscyBvbiB0aGUgZXhwZXJpbWVudGFsIGRlc2lnbik/IEJlIGFzIHRyYW5zcGFyZW50IGFzIHBvc3NpYmxlIHNvIHRoYXQgY29uY2x1c2lvbnMgbWFkZSBmcm9tIHRoaXMgZGF0YSBhcmUgbm90IG1pc2ludGVycHJldGVkIGRvd24gdGhlIHJvYWQuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCkRlc2NyaWJlIGFueSBsaW1pdGF0aW9ucyB3aGVuIHVzaW5nIHRoZSBkYXRhIHRvIGFuc3dlciB0aGUgZG9tYWluIHByb2JsZW0gb2YgaW50ZXJlc3QuCgpgYGB7YXNpcywgaGVscCA9IFRSVUV9CldoaWxlIHRoZSBwcmV2aW91cyBzZWN0aW9uIGxheXMgb3V0IHRoZSBlbnRpcmUgY29sbGVjdGlvbiBwcm9jZXNzLCBoZXJlIGl0IGlzIGltcG9ydGFudCB0byBoaWdobGlnaHQgYW55IGxpbWl0YXRpb25zIGFzIHRoZXNlIG1heSBub3QgYmUgb2J2aW91cyB0byB0aG9zZSBmcm9tIG90aGVyIGZpZWxkcy4gVGhpcyBpbmNsdWRlcyBhbnkgcGVyc29uYWwganVkZ2VtZW50IGNhbGxzIG1hZGUgaW4gdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLgpgYGAKCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKV2hlcmUgaXMgdGhlIGRhdGEgc3RvcmVkLCBhbmQgaG93IGNhbiBpdCBiZSBhY2Nlc3NlZCBieSBvdGhlcnMgKGlmIGFwcGxpY2FibGUpPwoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgojIyBEYXRhIFNwbGl0dGluZwoKRGVjaWRlIG9uIHRoZSBwcm9wb3J0aW9uIG9mIGRhdGEgaW4gZWFjaCBzcGxpdC4KCkRlY2lkZSBvbiB0aGUgImhvdyIgdG8gc3BsaXQgdGhlIGRhdGEgKGUuZy4sIHJhbmRvbSBzYW1wbGluZywgc3RyYXRpZmllZCBzYW1wbGluZywgZXRjLiksIGFuZCBleHBsYWluIHdoeSB0aGlzIGlzIGEgcmVhc29uYWJsZSB3YXkgdG8gc3BsaXQgdGhlIGRhdGEuCgpgYGB7YXNpcywgaGVscCA9IFRSVUV9CkhlcmUsIHdlIHJlZmVyIHRvIHNwbGl0dGluZyBkYXRhIGludG8gdHJhaW5pbmcsIHZhbGlkYXRpb24sIGFuZCB0ZXN0IHBvcnRpb25zLiBHZW5lcmFsbHksIG9uZSBmaXRzIHNlbGVjdCBtb2RlbHMgKGluY2x1ZGluZyBhbnkgbmVjZXNzYXJ5IHR1bmluZyBwcm9jZWR1cmVzKSBvbiB0aGUgdHJhaW5pbmcgZGF0YSBhbmQgYXNzZXNzZXMgcHJlZGljdGlvbiBhY2N1cmFjeSBvbiB0aGUgdmFsaWRhdGlvbiBkYXRhIHRvIGNvbXBhcmUgbW9kZWxzIGFnYWluc3Qgb25lIGFub3RoZXIuICoqVGhlIHRlc3QgZGF0YSBzaG91bGQgb25seSBiZSB1dGlsaXplZCBvbmNlIGFmdGVyIGFsbCBkYXRhIGFuYWx5c2lzIGlzIGNvbXBsZXRlZC4qKgoKTm90ZSB0aGF0ICpob3cqIHRoZSBkYXRhIHNwbGl0dGluZyBpcyBwZXJmb3JtZWQgY2FuIGdyZWF0bHkgYWZmZWN0IHRoZSByZXN1bHRzLiBUaGlzIGlzIGJlY2F1c2UgZGF0YSBvZnRlbiBoYXZlIHVuZGVybHlpbmcgaW5oZXJlbnQgc3RydWN0dXJlcyBhbmQgcmVsYXRpb25zaGlwcyAoZS5nLiwgbG9uZ2l0dWRpbmFsIGluZm9ybWF0aW9uLCByZWxhdGVkIGluZGl2aWR1YWxzLCBldGhuaWNpdHksIHZhcnlpbmcgaG9zcGl0YWxzLCBldGMuKSB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbiBzcGxpdHRpbmcuIEFzIGEgY29uY3JldGUgZXhhbXBsZSwgaWYgdGhlIGRhdGEgdW5kZXIgc3R1ZHkgY29tZXMgZnJvbSBwYXRpZW50cyBhY3Jvc3MgZm91ciBob3NwaXRhbHMsIGl0IGlzIG9mdGVuIGFkdmlzYWJsZSB0byBwZXJmb3JtIHRoZSBkYXRhIHNwbGl0dGluZyBieSBob3NwaXRhbCBzbyB0aGF0IHRoZSB0cmFpbmluZyBzZXQgaXMgY29tcG9zZWQgb2YgYWxsIHBhdGllbnRzIGZyb20gaG9zcGl0YWxzIEEgYW5kIEIsIHRoZSB2YWxpZGF0aW9uIHNldCBpcyBjb21wb3NlZCBvZiBhbGwgcGF0aWVudHMgZnJvbSBob3NwaXRhbCBDLCBhbmQgdGhlIHRlc3Qgc2V0IGlzIGNvbXBvc2VkIG9mIGFsbCBwYXRpZW50cyBmcm9tIGhvc3BpdGFsIEQuIEJ5IHNwbGl0dGluZyB0aGUgZGF0YSBpbiB0aGlzIHdheSwgdGhlIHZhbGlkYXRpb24gKG9yIHRlc3QpIGFjY3VyYWN5IGlzIGEgbW9yZSBhY2N1cmF0ZSBldmFsdWF0aW9uIG9mIGhvdyB0aGUgZml0dGVkIG1vZGVsIHdpbGwgcGVyZm9ybSBvbiBhIGNvbXBsZXRlbHkgbmV3IGJhdGNoIG9mIGRhdGEgaW4gdGhlIGZ1dHVyZS4gVWx0aW1hdGVseSwgdGhlIGdvYWwgb2YgdGhlIGRhdGEgc3BsaXR0aW5nIHNjaGVtZSBpcyB0byBtaW1pYyB0aGUgcHJvY2VzcyBvZiBvYnRhaW5pbmcgbmV3ICoqZnV0dXJlIGRhdGEqKi4KYGBgCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKClNwbGl0IHRoZSBkYXRhIGludG8gYSB0cmFpbmluZywgdmFsaWRhdGlvbiwgYW5kIHRlc3Qgc2V0LgoKYGBge3Igc3BsaXQtZGF0YX0KZGF0YV9zcGxpdCA8LSBzcGxpdF9kYXRhKFggPSBYLCB5ID0geSwgc3RyYXRpZmllZF9ieSA9IHksCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbl9wcm9wID0gcGFyYW1zJHRyYWluX3Byb3AsIAogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfcHJvcCA9IHBhcmFtcyR2YWxpZF9wcm9wLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcHJvcCA9IHBhcmFtcyR0ZXN0X3Byb3ApClh0cmFpbiA8LSBkYXRhX3NwbGl0JFgkdHJhaW4KWHZhbGlkIDwtIGRhdGFfc3BsaXQkWCR2YWxpZGF0ZQpYdGVzdCA8LSBkYXRhX3NwbGl0JFgkdGVzdAp5dHJhaW4gPC0gZGF0YV9zcGxpdCR5JHRyYWluCnl2YWxpZCA8LSBkYXRhX3NwbGl0JHkkdmFsaWRhdGUKeXRlc3QgPC0gZGF0YV9zcGxpdCR5JHRlc3QKYGBgCgpQcm92aWRlIHN1bW1hcnkgc3RhdGlzdGljcyBhbmQvb3IgZmlndXJlcyBvZiB0aGUgdGhyZWUgZGF0YSBzZXRzIHRvIGlsbHVzdHJhdGUgaG93IHNpbWlsYXIgKG9yIGRpZmZlcmVudCkgdGhleSBhcmUuCgpgYGB7YXNpcywgaGVscCA9IFRSVUV9ClRoaXMgc3RlcCBpcyBpbXBvcnRhbnQgYXMgaXQgY2FuIGhpZ2hsaWdodCBhbnkgY29uY2VybnMgd2l0aCB5b3VyIGNob3NlbiBzcGxpdHRpbmcgcnVsZS4gRm9yIGluc3RhbmNlLCB1bmRlciB0aGUgY2xhc3NpZmljYXRpb24gc2V0dGluZywgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjYXRlZ29yaWVzIHNob3VsZCBiZSBzaW1pbGFyIGFjcm9zcyB0aGUgdGhyZWUgZGF0YSBzZXRzLgpgYGAKCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyMjIERhdGEgU3BsaXR0aW5nIE92ZXJ2aWV3IHsudGFic2V0IC5jdXN0b20tdGFic30KCiMjIyMgWCBEYXRhIFNwbGl0IHsudW5udW1iZXJlZH0KCmBgYHtyIFgtZGF0YS1zcGxpdCwgYWRkX25ld19saW5lID0gVFJVRX0KcGxvdF9kYXRhX3NwbGl0KFh0cmFpbiwgWHZhbGlkLCBYdGVzdCwgCiAgICAgICAgICAgICAgICB4bGFiID0gIlgiLCB0aXRsZSA9ICJPdmVyYWxsIFggRGlzdHJpYnV0aW9uIikKYGBgCgojIyMjIFkgRGF0YSBTcGxpdCB7LnVubnVtYmVyZWR9CgpgYGB7ciB5LWRhdGEtc3BsaXQsIGFkZF9uZXdfbGluZSA9IFRSVUV9CnBsb3RfZGF0YV9zcGxpdCh5dHJhaW4sIHl2YWxpZCwgeXRlc3QsIAogICAgICAgICAgICAgICAgeGxhYiA9ICJ5IiwgdGl0bGUgPSAiT3ZlcmFsbCB5IERpc3RyaWJ1dGlvbiIpCmBgYAoKIyMgRGF0YSBDbGVhbmluZyBhbmQgUHJlcHJvY2Vzc2luZwoKV2hhdCBzdGVwcyB3ZXJlIHRha2VuIHRvIGNsZWFuIHRoZSBkYXRhPyBNb3JlIGltcG9ydGFudGx5LCB3aHkgd2FzIHRoZSBkYXRhIGNsZWFuZWQgaW4gdGhpcyB3YXk/CgpgYGB7YXNpcywgaGVscCA9IFRSVUV9CkRhdGEgY2xlYW5pbmcgY2FuIGJlIHZlcnkgcHJvYmxlbSBhbmQgZG9tYWluIGRlcGVuZGVudC4gQmUgc3VyZSB0byBzcGVjaWZ5IHdoaWNoIGFwcHJvYWNoZXMgYXJlIGNvbW1vbiBpbiB0aGUgZmllbGQgYW5kIHdoeS4gV2hlcmUgYXBwcm9wcmlhdGUsIGhpZ2hsaWdodCBhbnkgc3RlcHMgdGhhdCB3ZXJlIGp1ZGdlbWVudCBjYWxscyBuZWNlc3NhcnkgdG8gY29udGludWUgdGhlIGFuYWx5c2lzLiAKYGBgCgpEaXNjdXNzIGFsbCBpbmNvbnNpc3RlbmNpZXMsIHByb2JsZW1zLCBvZGRpdGllcyBpbiB0aGUgZGF0YSAoZS5nLiwgbWlzc2luZyBkYXRhLCBlcnJvcnMgaW4gZGF0YSwgb3V0bGllcnMsIGV0Yy4pLgoKUmVjb3JkIHlvdXIgcHJlcHJvY2Vzc2luZyBzdGVwcyBpbiBhIHdheSBzdWNoIHRoYXQgaWYgc29tZW9uZSBlbHNlIHdlcmUgdG8gcmVwcm9kdWNlIHlvdXIgYW5hbHlzaXMsIHRoZXkgY291bGQgZWFzaWx5IHJlcGxpY2F0ZSBhbmQgdW5kZXJzdGFuZCB5b3VyIHN0ZXBzLgoKSXQgY2FuIGJlIGhlbHBmdWwgdG8gaW5jbHVkZSByZWxldmFudCBwbG90cyB0aGF0IGV4cGxhaW4vanVzdGlmeSB0aGUgY2hvaWNlcyB0aGF0IHdlcmUgbWFkZSB3aGVuIGNsZWFuaW5nIHRoZSBkYXRhLgoKSWYgbW9yZSB0aGFuIG9uZSBwcmVwcm9jZXNzaW5nIHBpcGVsaW5lIGlzIHJlYXNvbmFibGUsIGV4YW1pbmUgdGhlIGltcGFjdHMgb2YgdGhlc2UgYWx0ZXJuYXRpdmUgcHJlcHJvY2Vzc2luZyBwaXBlbGluZXMgb24gdGhlIGZpbmFsIGRhdGEgcmVzdWx0cy4KCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KVGhlcmUgYXJlIG9mdGVuIG11bHRpcGxlLCBzdGFuZGFyZCBwcmVwcm9jZXNzaW5nIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdGVzdGVkIHRvIGFzc2VzcyBzdGFiaWxpdHkgb2YgcmVzdWx0cy4gQW55IGp1ZGdlbWVudCBjYWxscyBtZW50aW9uZWQgYWJvdmUgc2hvdWxkIGFsc28gYmUgY29tcGFyZWQgd2l0aCBhbHRlcm5hdGl2ZSBjaG9pY2VzIHdoZXJlIHBvc3NpYmxlLgpgYGAKCkFnYWluLCBiZSBhcyB0cmFuc3BhcmVudCBhcyBwb3NzaWJsZS4gVGhpcyBhbGxvd3Mgb3RoZXJzIHRvIG1ha2UgdGhlaXIgb3duIGVkdWNhdGVkIGRlY2lzaW9ucyBvbiBob3cgYmVzdCB0byBwcmVwcm9jZXNzIHRoZSBkYXRhLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQpHaXZlbiB0aGlzIGV4YW1wbGUgVENHQSBCUkNBIGRhdGEgc2V0LCB3ZSBmaXJzdCBwcmVwcm9jZXNzIHRoZSBkYXRhIGJ5IHJlbW92aW5nIGNvbnN0YW50IG9yIGR1cGxpY2F0ZWQgY29sdW1ucy4gVGhlbiBzaW5jZSB0aGUgYXJyYXkgZGF0YSBpcyBoaWdobHkgcmlnaHQgc2tld2VkLCB3ZSB3aWxsIGxvZy10cmFuc2Zvcm0gKGkuZS4sIGxvZyh4ICsgMSkpIHRoZSBkYXRhLiBGaW5hbGx5LCB0byBrZWVwIHRoaXMgZXhhbXBsZSB0ZW1wbGF0ZSByZWxhdGl2ZWx5IHF1aWNrIHRvIHJ1biwgd2Ugd2lsbCBvbmx5IGtlZXAgdGhlIDEwMDAgZmVhdHVyZXMgd2l0aCB0aGUgaGlnaGVzdCB2YXJpYW5jZS4KYGBgCgpgYGB7ciBwcmVwcm9jZXNzLWRhdGF9CiMjIERPIERBVEEgQ0xFQU5JTkcgLyBQUkUtUFJPQ0VTU0lORyBIRVJFIApYdHJhaW4gPC0gbG9nKFh0cmFpbiArIDEpICU+JQogIHJlbW92ZV9jb25zdGFudF9jb2xzKHZlcmJvc2UgPSAxKSAlPiUKICByZW1vdmVfZHVwbGljYXRlX2NvbHModmVyYm9zZSA9IDEpICU+JQogIGZpbHRlcl9jb2xzX2J5X3ZhcihtYXhfcCA9IDEwMDApClh2YWxpZCA8LSBsb2coWHZhbGlkICsgMSlbLCBjb2xuYW1lcyhYdHJhaW4pXQpYdGVzdCA8LSBsb2coWHRlc3QgKyAxKVssIGNvbG5hbWVzKFh0cmFpbildCmBgYAoKCiMjIERhdGEgRXhwbG9yYXRpb24KClRoZSBtYWluIGdvYWwgb2YgdGhpcyBzZWN0aW9uIGlzIHRvIGdpdmUgdGhlIHJlYWRlciBhIGZlZWwgZm9yIHdoYXQgdGhlIGRhdGEgImxvb2tzIGxpa2UiIGF0IGEgYmFzaWMgbGV2ZWwuCgpQcm92aWRlIHBsb3RzIHRoYXQgc3VtbWFyaXplIHRoZSBkYXRhIGFuZCBwZXJoYXBzIGV2ZW4gcGxvdHMgdGhhdCBjb252ZXkgc29tZSBzbWFsbGVyIGZpbmRpbmdzIHdoaWNoIHVsdGltYXRlbHkgbW90aXZhdGUgdGhlIG1haW4gZmluZGluZ3MuCgpQcm92aWRlIGFkZGl0aW9uYWwgcGxvdHMgcmVwcmVzZW50aW5nIHJlbWFpbmluZyBvZGRpdGllcyBhZnRlciBwcmUtcHJvY2Vzc2luZyBpZiBhcHBsaWNhYmxlLgoKQWRkIHN1bW1hcnkgc3RhdGlzdGljcyBpbiBhY2NvbXBhbnlpbmcgdGFibGVzIChvciBpbiBmaWd1cmVzKSBmb3IgcXVpY2sgY29tcGFyaXNvbnMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIyBEYXRhIE92ZXJ2aWV3IHsudGFic2V0IC5jdXN0b20tdGFic30KCmBgYHtyIGRhdGEtZGltcywgZWNobyA9IEZBTFNFfQojIHN1bW1hcnkgb2YgZGF0YSBkaW1lbnNpb25zCmdldF9kYXRhX2RpbWVuc2lvbnMoWHRyYWluID0gWHRyYWluLCBYdmFsaWQgPSBYdmFsaWQsIFh0ZXN0ID0gWHRlc3QpCmBgYAoKYGBge3IgZGF0YS10eXBlcywgcmVzdWx0cz0iYXNpcyIsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgc3VtbWFyeSBvZiB0eXBlcyBvZiBmZWF0dXJlcyBpbiAoWCwgeSkgZGF0YQpnZXRfZGF0YV90eXBlcyhYID0gWHRyYWluLCB5ID0geXRyYWluKQpgYGAKCiMjIyMgU3VtbWFyeSBUYWJsZXMgey51bm51bWJlcmVkfQoKYGBge3IgZGF0YS1zdW1tYXJ5LXRhYmxlLCByZXN1bHRzPSJhc2lzIiwgYWRkX25ld19saW5lID0gVFJVRX0KIyBicm9hZCBhcnJheSBvZiBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGZlYXR1cmVzIGluIHRyYWluaW5nIChYLCB5KQp0YWJfbHMgPC0gZ2V0X2RhdGFfc3VtbWFyeShYID0gWHRyYWluLCB5ID0geXRyYWluKQpmb3IgKGR0eXBlIGluIG5hbWVzKHRhYl9scykpIHsgICMgZ3JvdXBlZCBieSBkYXRhIHR5cGUKICBzdWJjaHVua2lmeSh0YWJfbHNbW2R0eXBlXV0sIGkgPSBkdHlwZSwgb3RoZXJfYXJncyA9ICJyZXN1bHRzPSdhc2lzJyIpCn0KYGBgCgojIyMjIFggRGlzdHJpYnV0aW9uIHsudW5udW1iZXJlZH0KCmBgYHtyIHgtZGlzdC1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIHBsb3QgWCBkaXN0cmlidXRpb24KcGxvdF9kYXRhX2Rpc3RyaWJ1dGlvbihkYXRhID0gWHRyYWluLCAKICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIlgiLCB0aXRsZSA9ICJUcmFpbmluZyBYIERpc3RyaWJ1dGlvbiIpCmBgYAoKIyMjIyBZIERpc3RyaWJ1dGlvbiB7LnVubnVtYmVyZWR9CgpgYGB7ciB5LWRpc3QtcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBwbG90IHkgZGlzdHJpYnV0aW9uCnBsb3RfZGF0YV9kaXN0cmlidXRpb24oZGF0YSA9IHl0cmFpbiwgCiAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJ5IiwgdGl0bGUgPSAiVHJhaW5pbmcgeSBEaXN0cmlidXRpb24iKQpgYGAKCiMjIyMgRGF0YSBIZWF0bWFwIHsudW5udW1iZXJlZH0KCmBgYHtyIGRhdGEtaGVhdG1hcCwgYWRkX25ld19saW5lID0gVFJVRX0KIyAoY2x1c3RlcmVkKSBoZWF0bWFwIG9mIChYLCB5KSBkYXRhCnBsb3RfZGF0YV9oZWF0bWFwKFggPSBYdHJhaW4sIHkgPSB5dHJhaW4sIGNsdXN0X3Jvd3MgPSBUUlVFLCBjbHVzdF9jb2xzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgc2hvd195dGV4dCA9IEZBTFNFLCB4X3RleHRfYW5nbGUgPSBUUlVFKQpgYGAKCiMjIyMgRmVhdHVyZSBDb3JyZWxhdGlvbiB7LnVubnVtYmVyZWR9CgpgYGB7ciBmZWF0dXJlLWNvci1oZWF0bWFwLCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIChjbHVzdGVyZWQpIGNvcnJlbGF0aW9uIGhlYXRtYXAKcGxvdF9jb3JfaGVhdG1hcChYID0gWHRyYWluLCBjb3JfdHlwZSA9ICJwZWFyc29uIiwgY2x1c3QgPSBUUlVFLAogICAgICAgICAgICAgICAgIHhfdGV4dF9hbmdsZSA9IFRSVUUpICsKICBnZ3Bsb3QyOjpsYWJzKHggPSAiRmVhdHVyZXMiLCB5ID0gIkZlYXR1cmVzIiwgZmlsbCA9ICJDb3IuIikKYGBgCgojIyMjIEZlYXR1cmUgUGFpciBQbG90cyB7LnVubnVtYmVyZWR9CgpgYGB7ciBmZWF0dXJlLXBhaXItcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBmZWF0dXJlIHBhaXIgcGxvdCAoZm9yIGEgc3Vic2V0IG9mIGZlYXR1cmVzKQprZWVwX2ZlYXR1cmVzIDwtIHNvcnQoCiAgc2FtcGxlKDE6bmNvbChYdHJhaW4pLCBtaW4obmNvbChYdHJhaW4pLCA2KSwgcmVwbGFjZSA9IEZBTFNFKQopCnBsb3RfcGFpcnMoZGF0YSA9IFh0cmFpbiwgY29sdW1ucyA9IGtlZXBfZmVhdHVyZXMsIAogICAgICAgICAgIGNvbG9yID0geXRyYWluLCBjb2xvcl9sYWJlbCA9ICJ5IikKYGBgCgojIyMjIE1hcmdpbmFsIEFzc29jaWF0aW9ucyB7LnVubnVtYmVyZWR9CgpgYGB7ciBtYXJnaW5hbC1hc3NvYy1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIG1hcmdpbmFsIGFzc29jaWF0aW9uIHBsb3RzIChmb3IgYSBzdWJzZXQgb2YgZmVhdHVyZXMpCmNhcmV0OjpmZWF0dXJlUGxvdCh4ID0gWHRyYWluWywga2VlcF9mZWF0dXJlc10sCiAgICAgICAgICAgICAgICAgICB5ID0geXRyYWluLAogICAgICAgICAgICAgICAgICAgcGxvdCA9IGlmIChpcy5mYWN0b3IoeXRyYWluKSkgImJveCIgZWxzZSAic2NhdHRlciIsCiAgICAgICAgICAgICAgICAgICBzY2FsZXMgPSBsaXN0KHggPSBsaXN0KHJlbGF0aW9uID0gImZyZWUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsaXN0KHJlbGF0aW9uID0gImZyZWUiKSkpCmBgYAoKIyMjIyBQQ0Egey51bm51bWJlcmVkfQoKYGBge3IgcGNhLXBsb3QsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgcGNhIHBsb3QKcGxvdF9wY2EoWCA9IFh0cmFpbiwgbnBjcyA9IDMsIGNvbG9yID0geXRyYWluLCBjb2xvcl9sYWJlbCA9ICJ5IiwKICAgICAgICAgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBGQUxTRSkkcGxvdApgYGAKCiMgUHJlZGljdGlvbiBNb2RlbGluZwoKRGlzY3VzcyB0aGUgcHJlZGljdGlvbiBtZXRob2RzIHVuZGVyIGNvbnNpZGVyYXRpb24sIGFuZCBleHBsYWluIHdoeSB0aGVzZSBtZXRob2RzIHdlcmUgY2hvc2VuLgoKYGBge2FzaXMsIGhlbHAgPSBUUlVFfQpUaGVyZSBhcmUgYW4gb3ZlcndoZWxtaW5nIG51bWJlciBvZiBtZXRob2RzIGF2YWlsYWJsZSwgYnV0IGF0IGxlYXN0IG9uZSBzaG91bGQgYmUgYSBjb21tb24gYXBwcm9hY2ggYWN0aW5nIGFzIGEgYmFzZWxpbmUuIFRoaXMgbWF5IG5vdCBiZSBvcHRpbWFsIGZvciB0aGUgcHJvYmxlbSBzZXR0aW5nLCBidXQgc2VydmVzIGFzIGEgaGVscGZ1bCBjb21wYXJpc29uLiBBbnkgImdvLXRvIiBtZXRob2RzIGluIHRoaXMgc2NpZW50aWZpYyBkb21haW4gc2hvdWxkIGFsc28gYmUgY29uc2lkZXJlZC4gRGlzY3VzcyB3aHkgdGhlc2UgYXJlIGZhdm9yZWQuIEZvciBpbnN0YW5jZSwgaXMgdGhlcmUgYSBuYXR1cmFsIHN0cnVjdHVyZSBpbiB0aGUgZGF0YSB0aGF0IGlzIGJldHRlciB1dGlsaXplZCBpbiBvbmUgYXBwcm9hY2ggdnMgYW5vdGhlcj8gQ29udmVyc2VseSwgbWVudGlvbiBpZiB0aGVyZSBhcmUgYXBwcm9hY2hlcyB0aGF0IGFyZSB0eXBpY2FsbHkgYXZvaWRlZCBpbiB0aGVzZSBwcm9ibGVtcy4gVGhlIGxpbWl0YXRpb25zIGRpc2N1c3NlZCBwcmV2aW91c2x5IGNhbiBhbHNvIGhlbHAgdG8gZ3VpZGUgdGhlc2UgbW9kZWxpbmcgZGVjaXNpb25zLgoKRnVydGhlcm1vcmUsIHRoaW5rIGJhY2sgdG8gdGhlIGJpZyBwaWN0dXJlLiBJZiBpbnRlcnByZXRhYmlsaXR5IGlzIGltcG9ydGFudCwgbWV0aG9kcyBmYXZvcmluZyBzcGFyc2VyLCBzaW1wbGVyIG1vZGVscyBtYXkgYmUgcHJlZmVycmVkIChlLmcuLCBzcGFyc2UgcmVncmVzc2lvbiBvciB0cmVlLWJhc2VkIHByb2NlZHVyZXMpLiBJZiBwcmVkaWN0aW9uIGlzIHRoZSBzb2xlIGdvYWwsIG1vcmUgY29tcGxleCBtb2RlbHMgbWF5IGJlIGFwcHJvcHJpYXRlLgoKSWYgY29tcHV0aW5nIHRpbWUgaXMgYSBidXJkZW4gYW5kIHJ1bGVzIG91dCBtZXRob2RzIHdpdGggaGlnaCBwb3RlbnRpYWwsIHRoaXMgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlIGFzIHNjYWxhYmlsaXR5IGFuZC9vciBjb21wdXRpbmcgcmVzb3VyY2VzIGltcHJvdmUuCmBgYAoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpEaXNjdXNzIHRoZSBhY2N1cmFjeSBtZXRyaWNzIHVuZGVyIGNvbnNpZGVyYXRpb24sIGFuZCBleHBsYWluIHdoeSB0aGVzZSBtZXRyaWNzIHdlcmUgY2hvc2VuLgoKYGBge2FzaXMsIGhlbHAgPSBUUlVFfQpUaGVzZSBhY2N1cmFjeSBtZXRyaWNzIHNob3VsZCBjbGVhcmx5IHN1cHBvcnQgdGhlIG1haW4gZ29hbCBvZiB0aGUgc3R1ZHkuIFRoZXJlIGFyZSBvZnRlbiBtdWx0aXBsZSB3YXlzIHRvIHF1YW50aWZ5IGFjY3VyYWN5IChlLmcuLCBSTVNFLCAkUl4yJCwgY29ycmVsYXRpb24sIEFVUk9DLCBBVVBSQywgY2xhc3NpZmljYXRpb24gYWNjdXJhY3kpLiBPZnRlbiwgY29tcGFyaW5nIGFjcm9zcyBzZXZlcmFsIG1ldHJpY3MgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBzdGFiaWxpdHkgY2hlY2sgYW5kIGEgbW9yZSBob2xpc3RpYyBwaWN0dXJlIG9mIHRoZSBtb2RlbCBwZXJmb3JtYW5jZS4KYGBgCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCgojIyBQcmVkaWN0aW9uIGNoZWNrIHsudGFic2V0IC5jdXN0b20tdGFic30KCkNhcnJ5IG91dCB0aGUgcHJlZGljdGlvbiBwaXBlbGluZSwgb3V0bGluZWQgYWJvdmUuCgoxLiBGaXQgcHJlZGljdGlvbiBtZXRob2RzIG9uIHRyYWluaW5nIGRhdGEuIChOb3RlOiB0aGlzIGluY2x1ZGVzIGFueSBwYXJhbWV0ZXIgdHVuaW5nIHdoaWNoIG1heSByZXF1aXJlIGZ1cnRoZXIgZGF0YSBzcGxpdHRpbmcgKGUuZy4sIGstZm9sZCBjcm9zcy12YWxpZGF0aW9uKSAqKndpdGhpbiB0aGUgdHJhaW5pbmcgZGF0YSoqLikKMi4gRXZhbHVhdGUgcHJlZGljdGlvbiBtZXRob2RzIG9uIHZhbGlkYXRpb24gZGF0YS4KMy4gQ29tcGFyZSByZXN1bHRzLCBhbmQgZmlsdGVyIG91dCBwb29yIG1vZGVscy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKYGBge3IgY2FyZXQtZml0LXBhcmFtcywgZXZhbCA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gImNhcmV0IiwgZWNobyA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gImNhcmV0IiwgY2FjaGUgPSBGQUxTRX0KIyMgSUYgVVNJTkcgQ0FSRVQgTU9ERUxJTkcgQkFDS0VORCwgQ0hPT1NFIE1FVEhPRFMgQU5EIFRSQUlOSU5HIENPTlRST0xTIEhFUkUKY3Zfb3B0aW9ucyA8LSBsaXN0KG5mb2xkcyA9IDUsIAogICAgICAgICAgICAgICAgICAgZm9sZGlkcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICBtZXRyaWMgPSAiQWNjdXJhY3kiKQoKbW9kZWxfbGlzdCA8LSBsaXN0KAogIHJhbmdlciA9IGxpc3QoLnR1bmVfcGFyYW1zID0gbGlzdChtdHJ5ID0gcm91bmQoc2VxKHNxcnQobmNvbChYdHJhaW4pKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbChYdHJhaW4pIC8gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgub3V0ID0gMykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHJ1bGUgPSAiZ2luaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5ub2RlLnNpemUgPSAxKSwKICAgICAgICAgICAgICAgIGltcG9ydGFuY2UgPSAiaW1wdXJpdHkiLAogICAgICAgICAgICAgICAgbnVtLnRocmVhZHMgPSAxKSwKICB4Z2JUcmVlID0gbGlzdChudGhyZWFkID0gMSkKKQpgYGAKCmBgYHtyIGgyby1maXQtcGFyYW1zLCBldmFsID0gcGFyYW1zJG1vZGVsaW5nX3BrZyA9PSAiaDJvIiwgZWNobyA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gImgybyIsIGNhY2hlID0gRkFMU0V9CiMjIElGIFVTSU5HIEgyTyBNT0RFTElORyBCQUNLRU5ELCBDSE9PU0UgTUVUSE9EUyBBTkQgVFJBSU5JTkcgQ09OVFJPTFMgSEVSRQpjdl9vcHRpb25zIDwtIGxpc3QobmZvbGRzID0gNSwKICAgICAgICAgICAgICAgICAgIGZvbGRpZHMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgbWV0cmljID0gImFjY3VyYWN5IikKCm1vZGVsX2xpc3QgPC0gbGlzdCgKICByYW5kb21Gb3Jlc3QgPSBsaXN0KC50dW5lX3BhcmFtcyA9IGxpc3QobXRyaWVzID0gcm91bmQoc2VxKHNxcnQobmNvbChYdHJhaW4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2woWHRyYWluKSAvIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgub3V0ID0gMykpKSwKICAgICAgICAgICAgICAgICAgICAgIG50cmVlcyA9IDUwMCksCiAgeGdib29zdCA9IGxpc3QoKQopCgojIGluaXRpYWxpemUgaDJvIGNsdXN0ZXIKaDJvOjpoMm8uaW5pdChudGhyZWFkcyA9IC0xKQpgYGAKCmBgYHtyIHRpZHltb2RlbHMtZml0LXBhcmFtcywgZXZhbCA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gInRpZHltb2RlbHMiLCBlY2hvID0gcGFyYW1zJG1vZGVsaW5nX3BrZyA9PSAidGlkeW1vZGVscyIsIGNhY2hlID0gRkFMU0V9CiMjIElGIFVTSU5HIFRJRFlNT0RFTFMgQkFDS0VORCwgQ0hPT1NFIE1FVEhPRFMgQU5EIFRSQUlOSU5HIENPTlRST0xTIEhFUkUKY3Zfb3B0aW9ucyA8LSBsaXN0KG5mb2xkcyA9IDUsCiAgICAgICAgICAgICAgICAgICBmb2xkaWRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIG1ldHJpYyA9ICJhY2N1cmFjeSIpCgptb2RlbF9saXN0IDwtIGxpc3QoCiAgcmFuZF9mb3Jlc3QgPSBsaXN0KC50dW5lX3BhcmFtcyA9IGxpc3QobXRyeSA9IHJvdW5kKHNlcShzcXJ0KG5jb2woWHRyYWluKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sKFh0cmFpbikgLyAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDMpKSksCiAgICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IGxpc3QoZW5naW5lID0gInJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9ICJpbXB1cml0eSIpKSwKICBib29zdF90cmVlID0gbGlzdChlbmdpbmUgPSAieGdib29zdCIpCikKYGBgCgpgYGB7ciBmaXQtbW9kZWxzfQojIGZpdC90cmFpbiBtb2RlbHMKZml0X3Jlc3VsdHMgPC0gZml0X21vZGVscyhYdHJhaW4gPSBYdHJhaW4sIHl0cmFpbiA9IHl0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9saXN0ID0gbW9kZWxfbGlzdCwgY3Zfb3B0aW9ucyA9IGN2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gcGFyYW1zJG1vZGVsaW5nX3BrZykKCiMgbWFrZSBwcmVkaWN0aW9uIG9uIHZhbGlkYXRpb24gc2V0CnByZWRfcmVzdWx0cyA8LSBwcmVkaWN0X21vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzLCBYdGVzdCA9IFh2YWxpZCkKCiMgZXZhbHVhdGUgcHJlZGljdGlvbnMgb24gdmFsaWRhdGlvbiBzZXQKZXZhbF9yZXN1bHRzIDwtIGV2YWx1YXRlX21vZGVscyhwcmVkX2RmID0gcHJlZF9yZXN1bHRzLCB5dGVzdCA9IHl2YWxpZCkKCiMgY29sbGVjdCBmZWF0dXJlIGltcG9ydGFuY2UgbWV0cmljcyBmcm9tIG1vZGVsIGZpdHMKaW1wX3Jlc3VsdHMgPC0gaW50ZXJwcmV0X21vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzKQpgYGAKCgojIyMgRml0IFN1bW1hcnkgey51bm51bWJlcmVkIC50YWJzZXQgLnRhYnNldC1waWxsc30KCmBgYHtyIGZpdC1zdW1tYXJ5LCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgcHJpbnQgb3V0IGZpdCBvdXRwdXQgc3VtbWFyeQpwcmludF9maXRfcmVzdWx0cyhmaXRfcmVzdWx0cykKYGBgCgojIyMgUHJlZGljdGlvbiBSZXN1bHRzIHsudW5udW1iZXJlZH0KCmBgYHtyIHByZWRpY3Rpb24tcmVzdWx0cywgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImFzaXMifQojIGRpc3BsYXkgcHJlZGljdGlvbiBtZXRyaWNzLCBjb25mdXNpb24gbWF0cmljZXMsIGFuZCByb2MvcHIgcGxvdHMgaWYgYXBwbGljYWJsZQpwcmludF9ldmFsX3Jlc3VsdHMoZXZhbF9yZXN1bHRzLCBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGh0bWxfb3B0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICJ0IiwgcGFnZUxlbmd0aCA9IG5yb3coZXZhbF9yZXN1bHRzKSkKICAgICAgICAgICAgICAgICAgICkpCmBgYAoKIyMgU3RhYmlsaXR5IGNoZWNrIHsudGFic2V0IC5jdXN0b20tdGFic30KClRha2luZyB0aGUgcHJlZGljdGlvbiBtZXRob2RzIHRoYXQgcGFzcyB0aGUgcHJlZGljdGlvbiBjaGVjaywgcGVyZm9ybSBhIHN0YWJpbGl0eSBhbmFseXNpcy4KCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KT25lIHdheSB0byBhc3Nlc3MgYSBtb2RlbCdzIHN0YWJpbGl0eSBpcyB0byBhc3Nlc3MgY2hhbmdlcyBpbiBtb2RlbCdzIHZhbGlkYXRpb24gYWNjdXJhY3kgYmFzZWQgb24gYXBwcm9wcmlhdGUgZGF0YSBwZXJ0dXJiYXRpb25zIG9mIHRoZSB0cmFpbmluZyBkYXRhLiBIb3dldmVyLCB0aGlzIHN0YWJpbGl0eSBhbmFseXNpcyBpcyBoZWF2aWx5IGRlcGVuZGVudCBvbiB0aGUgcHJvYmxlbSBhdCBoYW5kIGFuZCBzaG91bGQgYmUgdGFpbG9yZWQgdG8gYXNzZXNzIHRoZSBzdGFiaWxpdHkgb2YgbWV0cmljcyB0aGF0IGFyZSByZWxldmFudCB0byB0aGUgZG9tYWluIHByb2JsZW0uCmBgYAoKMS4gU3BlY2lmeSBhbmQganVzdGlmeSB0aGUgYXBwcm9wcmlhdGUgZGF0YSBwZXJ0dXJiYXRpb24ocykuCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KQXMgd2hlbiBkZXRlcm1pbmluZyBhbiBhcHByb3ByaWF0ZSBzcGxpdHRpbmcgcnVsZSwgdGhlIHBlcnR1cmJhdGlvbiBzY2hlbWUgc2hvdWxkIGluY29ycG9yYXRlIGFueSBrbm93biBkYXRhIHN0cnVjdHVyZS4gRm9yIGluc3RhbmNlLCBpZiB1c2luZyBhIGJvb3RzdHJhcCBhcHByb2FjaCB3aXRoIHN0cnVjdHVyZWQgZGF0YSwgc3RyYXRpZmllZCBzYW1wbGluZyBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byBiZXR0ZXIgbWltaWMgdGhlIHByb2Nlc3Mgb2Ygb2J0YWluaW5nIGEgbmV3IGJhdGNoIG9mIGRhdGEgaW4gdGhlIGZ1dHVyZS4KYGBgCgoyLiBSZS1maXQgdGhlIHByZWRpY3Rpb24gbWV0aG9kcyBvbiB0aGVzZSBwZXJ0dXJiZWQgZGF0YSBzZXRzLgozLiBFdmFsdWF0ZSBwcmVkaWN0aW9uIG1ldGhvZHMgb24gdmFsaWRhdGlvbiBkYXRhLgo0LiBBc3Nlc3Mgc3RhYmlsaXR5IGFjcm9zcyB0aGUgZGF0YSBwZXJ0dXJiYXRpb25zIGFzIHdlbGwgYXMgYWNyb3NzIHRoZSB2YXJpb3VzIG1ldGhvZHMuCjUuIEZpbHRlciBvdXQgcG9vciBtb2RlbHMgd2hlcmUgbmVjZXNzYXJ5IGFuZCBpbnRlcnByZXQgc3RhYmlsaXR5IHJlc3VsdHMuCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KTWV0aG9kcyB3aXRoIGhpZ2hseSB2YXJpYWJsZSBhY2N1cmFjeSBzaG91bGQgYmUgZGlzY2FyZGVkLiBJbiBhZGRpdGlvbiwgdGFrZSBub3RlIGlmIGFueSBzZXQgb2YgcGVydHVyYmF0aW9ucyByZXN1bHRlZCBpbiB1bmlmb3JtbHkgcG9vciBhY2N1cmFjeSBhY3Jvc3MgbWV0aG9kcy4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhbiB1bmRlcmx5aW5nIGlzc3VlIHdpdGggdGhlIHBlcnR1cmJhdGlvbiBzY2hlbWUuCmBgYAoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgoKYGBge3Igc3RhYmlsaXR5LWNoZWNrfQpuX3JlcHMgPC0gcGFyYW1zJG5fZGF0YV9wZXJ0dXJiYXRpb25zCgojIHAgPC0gcHJvZ3Jlc3NyOjpwcm9ncmVzc29yKHN0ZXBzID0gbl9yZXBzKQojIGZ1dHVyZTo6cGxhbihtdWx0aXNlc3Npb24sIHdvcmtlcnMgPSBtaW4obl9yZXBzLCBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSAtIDEpKQpib290c3RyYXBfbW9kZWxfcmVzdWx0cyA8LSBmdXR1cmUuYXBwbHk6OmZ1dHVyZV9yZXBsaWNhdGUoCiAgbiA9IG5fcmVwcywKICBleHByID0gewogICAgYm9vdHN0cmFwIDwtIHNhbXBsZSgxOm5yb3coWHRyYWluKSwgbnJvdyhYdHJhaW4pLCByZXBsYWNlID0gVFJVRSkKICAgIFh0cmFpbl9iIDwtIFh0cmFpbltib290c3RyYXAsIF0KICAgIHl0cmFpbl9iIDwtIHl0cmFpbltib290c3RyYXBdCiAgICAKICAgICMgZml0L3RyYWluIG1vZGVscyBvbiBib290c3RyYXAgZGF0YQogICAgZml0X3Jlc3VsdHNfYiA8LSBmaXRfbW9kZWxzKFh0cmFpbiA9IFh0cmFpbl9iLCB5dHJhaW4gPSB5dHJhaW5fYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9saXN0ID0gbW9kZWxfbGlzdCwgY3Zfb3B0aW9ucyA9IGN2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gcGFyYW1zJG1vZGVsaW5nX3BrZykKCiAgICAjIG1ha2UgcHJlZGljdGlvbiBvbiB2YWxpZGF0aW9uIHNldAogICAgcHJlZF9yZXN1bHRzX2IgPC0gcHJlZGljdF9tb2RlbHMoZml0X2xpc3QgPSBmaXRfcmVzdWx0c19iLCBYdGVzdCA9IFh2YWxpZCkKCiAgICAjIGV2YWx1YXRlIHByZWRpY3Rpb25zIG9uIHZhbGlkYXRpb24gc2V0CiAgICBldmFsX3Jlc3VsdHNfYiA8LSBldmFsdWF0ZV9tb2RlbHMocHJlZF9kZiA9IHByZWRfcmVzdWx0c19iLCB5dGVzdCA9IHl2YWxpZCkKICAgIAogICAgIyBjb2xsZWN0IGZlYXR1cmUgaW1wb3J0YW5jZSBtZXRyaWNzIGZyb20gbW9kZWwgZml0cwogICAgaW1wX3Jlc3VsdHNfYiA8LSBpbnRlcnByZXRfbW9kZWxzKGZpdF9saXN0ID0gZml0X3Jlc3VsdHNfYikKICAgIAogICAgcmV0dXJuKGxpc3QoIyBmaXQgPSBmaXRfcmVzdWx0c19iLCAgIyB1bmNvbW1lbnQgaWYgbmVlZCBib290c3RyYXAgZml0czsgY2FuIGJlIG1lbW9yeSBpbnRlbnNpdmUKICAgICAgICAgICAgICAgIHByZWRpY3Rpb25zID0gcHJlZF9yZXN1bHRzX2IsCiAgICAgICAgICAgICAgICBldmFsX21ldHJpY3MgPSBldmFsX3Jlc3VsdHNfYiwKICAgICAgICAgICAgICAgIGltcG9ydGFuY2VzID0gaW1wX3Jlc3VsdHNfYikpCiAgfSwKICBzaW1wbGlmeSA9IEZBTFNFCikKCmJvb3RzdHJhcF9tb2RlbF9lcnJzIDwtIHB1cnJyOjptYXBfZGZyKGJvb3RzdHJhcF9tb2RlbF9yZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+LngkZXZhbF9tZXRyaWNzJG1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pZCA9ICJib290c3RyYXBfaWQiKQpib290c3RyYXBfbW9kZWxfcHJlZHMgPC0gcHVycnI6Om1hcChib290c3RyYXBfbW9kZWxfcmVzdWx0cywgInByZWRpY3Rpb25zIikKYm9vdHN0cmFwX21vZGVsX2ltcHMgPC0gcHVycnI6Om1hcF9kZnIoYm9vdHN0cmFwX21vZGVsX3Jlc3VsdHMsICJpbXBvcnRhbmNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pZCA9ICJib290c3RyYXBfaWQiKQoKIyBzdW1tYXJpemUgYm9vdHN0cmFwIG1vZGVsIGVycm9yIG1ldHJpY3MKYm9vdHN0cmFwX21vZGVsX2VycnNfc3VtbWFyeSA8LSBib290c3RyYXBfbW9kZWxfZXJycyAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBjKC1ib290c3RyYXBfaWQsIC1tZXRyaWMpLCAKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIk1ldGhvZCIsIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjpyZW5hbWUoTWV0cmljID0gbWV0cmljKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTWV0aG9kLCBNZXRyaWMpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoTWVhbiA9IG1lYW4oVmFsdWUpLCBTRCA9IHNkKFZhbHVlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgdGlkeXI6OnBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuLCBTRCksIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlZhbHVlIiwgbmFtZXNfdG8gPSAiU3RhdGlzdGljIikgJT4lCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAiTWV0aG9kIiwgdmFsdWVzX2Zyb20gPSAiVmFsdWUiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShNZXRyaWMsIFN0YXRpc3RpYykKYGBgCgojIyMgVGFibGUgey51bm51bWJlcmVkfQoKYGBge3Igc3RhYmlsaXR5LWNoZWNrLXRhYmxlLCByZXN1bHRzID0gImFzaXMifQojIHRhYmxlIG9mIGFjY3VyYWN5IG1ldHJpY3MKcHJldHR5X3RhYmxlKAogIGJvb3RzdHJhcF9tb2RlbF9lcnJzX3N1bW1hcnksIAogIGRpZ2l0cyA9IDIsIHNpZ2ZpZyA9IEZBTFNFLCByb3duYW1lcyA9IEZBTFNFLAogIGNhcHRpb24gPSAiVmFsaWRhdGlvbiBQcmVkaWN0aW9uIEFjY3VyYWNpZXMgT3ZlciBCb290c3RyYXBwZWQgVHJhaW5pbmcgRml0cyIsIAogIGh0bWxfb3B0aW9ucyA9IGxpc3QoCiAgICBleHRlbnNpb25zID0gIlJvd0dyb3VwIiwKICAgIG9wdGlvbnMgPSBsaXN0KAogICAgICBkb20gPSAidCIsCiAgICAgIHBhZ2VMZW5ndGggPSBucm93KGJvb3RzdHJhcF9tb2RlbF9lcnJzX3N1bW1hcnkpLAogICAgICBzY3JvbGxZID0gIjUwMHB4IiwKICAgICAgcm93R3JvdXAgPSBsaXN0KGRhdGFTcmMgPSAwKSwKICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAiZHQtY2VudGVyIiwgdGFyZ2V0cyA9ICJfYWxsIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QodmlzaWJsZSA9IEZBTFNFLCB0YXJnZXRzID0gMCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QodGl0bGUgPSAiTWV0cmljIiwgdGFyZ2V0cyA9IDEpKQogICAgKQogICkKKQpgYGAKCiMjIyBQbG90IHsudW5udW1iZXJlZH0KCmBgYHtyIHN0YWJpbGl0eS1jaGVjay1ib3hwbG90fQojIGJveHBsb3RzCmJvb3RzdHJhcF9tb2RlbF9lcnJzICU+JQogIHRpZHlyOjpwaXZvdF9sb25nZXIoY29scyA9IGMoLWJvb3RzdHJhcF9pZCwgLW1ldHJpYyksIAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiTWV0aG9kIiwgdmFsdWVzX3RvID0gIlZhbHVlIikgJT4lCiAgcGxvdF9ib3hwbG90KHhfc3RyID0gIk1ldGhvZCIsIHlfc3RyID0gIlZhbHVlIikgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofiBtZXRyaWMpICsKICBnZ3Bsb3QyOjpsYWJzKHRpdGxlID0gIlZhbGlkYXRpb24gUHJlZGljdGlvbiBBY2N1cmFjaWVzIE92ZXIgQm9vdHN0cmFwcGVkIFRyYWluaW5nIEZpdHMiKQpgYGAKCiMjIEludGVycHJldGFiaWxpdHkgey50YWJzZXQgLmN1c3RvbS10YWJzfQoKRm9yIHRoZSBtb2RlbHMgdGhhdCBwYXNzIHRoZSBwcmVkaWN0aW9uIGFuZCBzdGFiaWxpdHkgY2hlY2tzLCBleHRyYWN0IHRoZSBpbXBvcnRhbnQgZmVhdHVyZXMgaW4gdGhlIHByZWRpY3RpdmUgbW9kZWxzIHRoYXQgYXJlIHN0YWJsZSBhY3Jvc3MgYm90aCBkYXRhIGFuZCBtb2RlbCBwZXJ0dXJiYXRpb25zLiBEZXRlcm1pbmluZyB0aGUgaW1wb3J0YW5jZSBvZiBhIGZlYXR1cmUgY2FuIGJlIG1ldGhvZCBkZXBlbmRlbnQuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIyBGdWxsIE1vZGVsICh3aXRob3V0IHN0YWJpbGl0eSkgey51bm51bWJlcmVkIC50YWJzZXQgLnRhYnNldC1waWxsc30KCiMjIyMgVGFibGUgey51bm51bWJlcmVkfQoKYGBge3IgaW50ZXJwcmV0YWJpbGl0eS10YWJsZSwgYWRkX25ld19saW5lID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KcHJldHR5X3RhYmxlKGltcF9yZXN1bHRzLCBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGQUxTRSwKICAgICAgICAgICAgIGNhcHRpb24gPSAiVmFyaWFibGUgSW1wb3J0YW5jZXMiKQpgYGAKCiMjIyMgUGxvdHMgey51bm51bWJlcmVkfQoKYGBge3IgaW50ZXJwcmV0YWJpbGl0eS1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90X2ZlYXR1cmVfaW1wb3J0YW5jZShpbXBfcmVzdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3JhbmtpbmdzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mYWNldHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSA9IEZBTFNFKQpgYGAKCmBgYHtyIGludGVycHJldGFiaWxpdHktcGFpci1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90X2ZlYXR1cmVfaW1wb3J0YW5jZV9wYWlyKGltcF9yZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9yYW5raW5ncyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSBGQUxTRSkKYGBgCgojIyMgQm9vdHN0cmFwcGVkIE1vZGVsICh3aXRoIHN0YWJpbGl0eSkgey51bm51bWJlcmVkIC50YWJzZXQgLnRhYnNldC1waWxsc30KCiMjIyMgVGFibGUgey51bm51bWJlcmVkfQoKYGBge3IgYm9vdC1pbnRlcnByZXRhYmlsaXR5LXRhYmxlLCBhZGRfbmV3X2xpbmUgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQpib290c3RyYXBfbW9kZWxfaW1wc19zdW1tYXJ5IDwtIGJvb3RzdHJhcF9tb2RlbF9pbXBzICU+JQogIGRwbHlyOjpncm91cF9ieShNZXRob2QsIFZhcmlhYmxlKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKGBNZWFuIEltcG9ydGFuY2VgID0gbWVhbihJbXBvcnRhbmNlKSwKICAgICAgICAgICAgICAgICAgIGBNZWRpYW4gSW1wb3J0YW5jZWAgPSBtZWRpYW4oSW1wb3J0YW5jZSksCiAgICAgICAgICAgICAgICAgICBgU0QgSW1wb3J0YW5jZWAgPSBzZChJbXBvcnRhbmNlKSwKICAgICAgICAgICAgICAgICAgIGBNaW4gSW1wb3J0YW5jZWAgPSBtaW4oSW1wb3J0YW5jZSksCiAgICAgICAgICAgICAgICAgICBgTWF4IEltcG9ydGFuY2VgID0gbWF4KEltcG9ydGFuY2UpLCAKICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAia2VlcCIpCnByZXR0eV90YWJsZSgKICBib290c3RyYXBfbW9kZWxfaW1wc19zdW1tYXJ5LCAKICBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGLCAKICBjYXB0aW9uID0gIlN1bW1hcnkgb2YgdmFyaWFibGUgaW1wb3J0YW5jZXMgYWNyb3NzIGJvb3RzdHJhcHBlZCBtb2RlbHMiCikKYGBgCgojIyMjIFBsb3RzIHsudW5udW1iZXJlZH0KCmBgYHtyIGJvb3QtaW50ZXJwcmV0YWJpbGl0eS1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90X2ZlYXR1cmVfaW1wb3J0YW5jZV9zdGFiaWxpdHkoYm9vdHN0cmFwX21vZGVsX2ltcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfcmFua2luZ3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mYWNldHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSBGQUxTRSkKYGBgCgojIE1haW4gUmVzdWx0cwoKIyMgey51bm51bWJlcmVkIC50YWJzZXQgLmN1c3RvbS10YWJzfQoKSW50ZXJwcmV0IGFuZCBzdW1tYXJpemUgdGhlIHByZWRpY3Rpb24gYW5kIHN0YWJpbGl0eSByZXN1bHRzLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpFdmFsdWF0ZSBwaXBlbGluZSBvbiB0ZXN0IGRhdGEuCgpgYGB7YXNpcywgaGVscCA9IFRSVUV9CkNhcmVmdWwhIFJlbWVtYmVyIHRoYXQgKip0ZXN0IGRhdGEgc2hvdWxkIG9ubHkgYmUgdG91Y2hlZCBvbmNlKiouIFRoZXNlIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIG1ha2UgcG9zdC1hbmFseXNpcyBtb2RlbGluZyBkZWNpc2lvbnMuIFRoaXMgaXMgImRvdWJsZS1kaXBwaW5nIiBhbmQgbm90IGFuIGFjY3VyYXRlIG1lYXN1cmVtZW50IG9mIG91dC1vZi1zYW1wbGUgYWNjdXJhY3kuCmBgYAoKYGBge3IgZmluYWwtZml0c30KWHRyYWluX2ZpbmFsIDwtIGRwbHlyOjpiaW5kX3Jvd3MoWHRyYWluLCBYdmFsaWQpCnl0cmFpbl9maW5hbCA8LSBjKHl0cmFpbiwgeXZhbGlkKQoKIyBmaXQvdHJhaW4gbW9kZWxzCmZpdF9yZXN1bHRzX2ZpbmFsIDwtIGZpdF9tb2RlbHMoWHRyYWluID0gWHRyYWluX2ZpbmFsLCB5dHJhaW4gPSB5dHJhaW5fZmluYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbGlzdCA9IG1vZGVsX2xpc3QsIGN2X29wdGlvbnMgPSBjdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSA9IHBhcmFtcyRtb2RlbGluZ19wa2cpCgojIG1ha2UgcHJlZGljdGlvbiBvbiB0ZXN0IHNldApwcmVkX3Jlc3VsdHNfZmluYWwgPC0gcHJlZGljdF9tb2RlbHMoZml0X2xpc3QgPSBmaXRfcmVzdWx0c19maW5hbCwgWHRlc3QgPSBYdGVzdCkKCiMgZXZhbHVhdGUgcHJlZGljdGlvbnMgb24gdGVzdCBzZXQKZXZhbF9yZXN1bHRzX2ZpbmFsIDwtIGV2YWx1YXRlX21vZGVscyhwcmVkX2RmID0gcHJlZF9yZXN1bHRzX2ZpbmFsLCB5dGVzdCA9IHl0ZXN0KQoKIyBjb2xsZWN0IGZlYXR1cmUgaW1wb3J0YW5jZSBtZXRyaWNzIGZyb20gbW9kZWwgZml0cwppbXBfcmVzdWx0c19maW5hbCA8LSBpbnRlcnByZXRfbW9kZWxzKGZpdF9saXN0ID0gZml0X3Jlc3VsdHNfZmluYWwpCmBgYAoKU3VtbWFyaXplIHRlc3Qgc2V0IHByZWRpY3Rpb24gYW5kL29yIGludGVycHJldGFiaWxpdHkgcmVzdWx0cy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKCiMjIyBGaXQgU3VtbWFyeSB7LnVubnVtYmVyZWQgLnRhYnNldCAudGFic2V0LXBpbGxzfQoKYGBge3IgZmluYWwtZml0LXN1bW1hcnksIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIn0KIyBwcmludCBvdXQgZml0IG91dHB1dCBzdW1tYXJ5CnByaW50X2ZpdF9yZXN1bHRzKGZpdF9yZXN1bHRzX2ZpbmFsKQpgYGAKCiMjIyBQcmVkaWN0aW9uIFJlc3VsdHMgey51bm51bWJlcmVkfQoKYGBge3IgZmluYWwtcHJlZGljdGlvbi1yZXN1bHRzLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgZGlzcGxheSBwcmVkaWN0aW9uIG1ldHJpY3MsIGNvbmZ1c2lvbiBtYXRyaWNlcywgYW5kIHJvYy9wciBwbG90cyBpZiBhcHBsaWNhYmxlCnByaW50X2V2YWxfcmVzdWx0cyhldmFsX3Jlc3VsdHNfZmluYWwsIHRlc3Rfc2V0ID0gVFJVRSwgZGlnaXRzID0gMiwgc2lnZmlnID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBodG1sX29wdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAidCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gbnJvdyhldmFsX3Jlc3VsdHNfZmluYWwpKQogICAgICAgICAgICAgICAgICAgKSkKYGBgCgojIFBvc3QgaG9jIGFuYWx5c2lzCgpNb3ZlIGJleW9uZCB0aGUgZ2xvYmFsIHByZWRpY3Rpb24gYWNjdXJhY3kgbWV0cmljcyBhbmQgZGl2ZSBkZWVwZXIgaW50byBpbmRpdmlkdWFsLWxldmVsIHByZWRpY3Rpb25zIGZvciB0aGUgdmFsaWRhdGlvbiBhbmQvb3IgdGVzdCBzZXQsIGkuZS4sIHByb3ZpZGUgYSBtb3JlICJsb2NhbCIgYW5hbHlzaXMuCgpFeGFtaW5lIGFueSBwb2ludHMgdGhhdCBoYWQgcG9vciBwcmVkaWN0aW9ucy4KCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KQXMgbWVudGlvbmVkIGluIHRoZSBzdGFiaWxpdHkgYW5hbHlzaXMsIGNoZWNrIGZvciBhbnkgY29tbW9uYWxpdGllcyBhbW9uZyBwZXJ0dXJiYXRpb25zLCBvciBzcGVjaWZpYyBvYnNlcnZhdGlvbnMsIHRoYXQgcmVzdWx0ZWQgaW4gcG9vciBhY2N1cmFjeSBtZXRyaWNzIGFjcm9zcyBwcm9jZWR1cmVzLgpgYGAKCkV4YW1pbmUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0aW9uIG1ldGhvZHMuCgpgYGB7YXNpcywgaGVscCA9IFRSVUV9CkFyZSB0aGVyZSBjZXJ0YWluIG1ldGhvZHMgdGhhdCBtYXkgbm90IGJlIG92ZXJhbGwgdGhlIG1vc3QgYWNjdXJhdGUsIGJ1dCBvdXRwZXJmb3JtIG90aGVycyBvbiB0aGUgbW9yZSAiY2hhbGxlbmdpbmciIHZhbGlkYXRpb24vdGVzdCBvYnNlcnZhdGlvbnM/IENvbnZlcnNlbHksIGFyZSBzb21lIHByb2NlZHVyZXMgdmVyeSBlZmZlY3RpdmUgYWNyb3NzIHRoZSBtYWpvcml0eSBvZiBvYnNlcnZhdGlvbnMsIGJ1dCBzb21lIG91dGx5aW5nIGJlaGF2aW9yIGVmZmVjdHMgb3ZlcmFsbCByZXN1bHRzPwpgYGAKCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKYGBge3IgcG9zdGhvYy1wYWlyLXBsb3R9CnByZWRfcmVzdWx0c19maW5hbCAlPiUKICBkcGx5cjo6bXV0YXRlKC5pZCA9IHJlcCgxOm5yb3coWHRlc3QpLCBsZW5ndGgub3V0ID0gZHBseXI6Om4oKSkpICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzID0gLmlkLCAKICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9ICJtZXRob2QiLCB2YWx1ZXNfZnJvbSA9ICJwcmVkaWN0aW9ucyIpICU+JQogIGRwbHlyOjptdXRhdGUoYFRydWUgUmVzcG9uc2VzYCA9IHl0ZXN0KSAlPiUKICBwbG90X3BhaXJzKGNvbHVtbnMgPSAyOihsZW5ndGgodW5pcXVlKHByZWRfcmVzdWx0c19maW5hbCRtZXRob2QpKSArIDIpLAogICAgICAgICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBtb2RlbCB0ZXN0IHByZWRpY3Rpb25zIikKYGBgCgojIENvbmNsdXNpb25zCgpSZWl0ZXJhdGUgbWFpbiBmaW5kaW5ncywgbm90ZSBhbnkgY2F2ZWF0cywgYW5kIGNsZWFybHkgdHJhbnNsYXRlIGZpbmRpbmdzL2FuYWx5c2lzIGJhY2sgdG8gdGhlIGRvbWFpbiBwcm9ibGVtIGNvbnRleHQuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCg==